package it.sebsibenal.server;

import it.sebsibenal.shared.Operazione;
import it.sebsibenal.shared.Song;
import it.sebsibenal.shared.User;
import it.sebsibenal.shared.UserGroup;

import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailService extends BaseService {

	public void inviaEmailNuovoBrano(Song song) {
		StringBuilder msgBody = new StringBuilder();
		msgBody.append("<h3>Sebsibenal Folk Project</h3><br><br>");
		msgBody.append("<p><b>"+getCurrentUser().getNickname()+"</b> ha aggiunto un nuovo brano!</p> (<b>"+song.getTitolo()+" di "+song.getAutore()+"</b>)");
		msgBody.append("<br><br><br><p>"+getStatusMessage()+"</p>");
		inviaEmail("Nuovo brano", msgBody.toString(), getUserGroupDAO().findByName("sebsibenal"));
	}

	public void inviaEmailOperazioneBrano(Song song, Operazione operazione) {
		String azione = "";
		switch (operazione) {
			case AGGIUNGI_VIDEO: azione="ha aggiunto un nuovo video al"; break;
			case MODIFICA_AUTORE: azione="ha modificato l'autore del"; break;
			case MODIFICA_DESCRIZIONE: azione="ha modificato la descrizione nel"; break;
			case MODIFICA_TESTO: azione="ha modificato il testo nel"; break;
			case MODIFICA_TITOLO: azione="ha modificato il titolo al"; break;
			case RIMUOVI_VIDEO: azione="ha rimosso un video dal"; break;
			case AGGIUNGI_COMMENTO: azione="ha commentato il"; break;
		default:
			break;
		}
		azione += " brano <b>" + song.getTitolo() + "</b> di <b>"+song.getAutore()+"</b><br>";
		StringBuilder msgBody = new StringBuilder();
		msgBody.append("<h3>Sebsibenal Folk Project</h3><br><br>");
		msgBody.append("<p><b>"+getCurrentUser().getNickname()+"</b> " + azione);
		String titoloEmail = "Modifiche su " + song.getTitolo() + " - "+song.getAutore();
		if (operazione == Operazione.AGGIUNGI_VIDEO) {
			msgBody.append("<p>http://www.youtube.com/watch?v="+song.getYoutubeLinks().get(song.getYoutubeLinks().size()-1)+"</p>");
			titoloEmail = "Nuovo video per " + song.getTitolo() + " - "+song.getAutore();
		} else
		if (operazione == Operazione.AGGIUNGI_COMMENTO) {
			msgBody.append(song.getCommenti().get(song.getCommenti().size()-1));
			titoloEmail = "Nuovo commento " + song.getTitolo() + " - "+song.getAutore();
		}
		msgBody.append("<br><br><br><p>"+getStatusMessage()+"</p>");
		inviaEmail(titoloEmail, msgBody.toString(),  getUserGroupDAO().findByName("sebsibenal"));
	}

	public void inviaEmailGenerica(String subject, String body) {
		StringBuilder msgBody = new StringBuilder();
		msgBody.append("<h3>Sebsibenal Folk Project</h3><br>");
		msgBody.append("<p><b>"+getCurrentUser().getNickname()+"</b> ha scritto al gruppo:</p>");
		msgBody.append("<br><p>"+body+"</p>");
		msgBody.append("<br><br><p>"+getStatusMessage()+"</p>");
		inviaEmail(subject, msgBody.toString(),  getUserGroupDAO().findByName("sebsibenal"));
	}


	private void inviaEmail(String subject, String msgBody, UserGroup group) {
		Properties props = new Properties();
		Session session = Session.getDefaultInstance(props);
		try {
			Message msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress("sebsibenal@gmail.com","Sebsibenal"));
			for (int i = 0; i < group.getMembers().length; i++) {
				Long userId = group.getMembers()[i].getId();
				User user = getUserDAO().findById(userId);
				msg.addRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail(), user.getNickname()));
			}
			msg.setSubject(subject);
			msg.setContent(msgBody, "text/html");
			Transport.send(msg);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (MessagingException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	private String getStatusMessage() {
		Calendar cal = Calendar.getInstance();
		int hour = cal.get(Calendar.HOUR_OF_DAY);
		// aggiustamento dell'ora con il server +2
		hour = (hour+2)%24;
		switch (hour) {
			case 0: return "Buona notte!";
			case 1: return "Buona notte!";
			case 2: return "Buona notte!";
			case 3: return "Buona notte!";
			case 4: return "Buona notte!";
			case 5: return "Buona notte!";
			case 6: return "Buon giorno!";
			case 7: return "Buon giorno!";
			case 8: return "Buona giornata!";
			case 9: return "Buona giornata!";
			case 10: return "Buona giornata!";
			case 11: return "Buona giornata!";
			case 12: return "Buon pranzo!";
			case 13: return "Buon pranzo!";
			case 14: return "Buon pomeriggio!";
			case 15: return "Buon pomeriggio!";
			case 16: return "Buon pomeriggio!";
			case 17: return "Buon pomeriggio!";
			case 18: return "Buon pomeriggio!";
			case 19: return "Buona serata!";
			case 20: return "Buona serata!";
			case 21: return "Buona serata!";
			case 22: return "Buona notte!";
			case 23: return "Buona notte!";
			case 24: return "Buona notte!";
		}
		return "";
	}

	
}
